﻿using System;
using UnityEngine;

namespace Nomo.UnityCoreModule.Enumerators
{
    /// <summary>
    /// 等待并每帧执行以“已经等待的真实时间占总共需要等待的真实时间的比例”为参数的方法，直到完成了指定真实时间的等待。
    /// </summary>
    public sealed class WaitDuringRealtime : CustomYieldInstruction
    {
        private readonly float         _time;
        private readonly Action<float> _action;
        private          float         _timer;

        /// <inheritdoc />
        public override bool keepWaiting
        {
            get
            {
                _timer += Time.unscaledDeltaTime;
                _action?.Invoke(_time > 0F ? Mathf.Clamp01(_timer / _time) : 1F);
                return _time > _timer;
            }
        }

        /// <summary>
        /// 使用指定的真实时间和要执行的方法初始化 <see cref="WaitDuringRealtime"/> 类的新实例。
        /// </summary>
        /// <param name="time">等待的真实时间。</param>
        /// <param name="action">一个方法，它的参数是已经等待的真实时间占总共需要等待的真实时间的比例。</param>
        public WaitDuringRealtime(float time, Action<float> action)
        {
            _time   = time;
            _action = action;
            _timer  = 0F;
        }
    }
}
